/**
 * SWA GUI by Daniel Draghici
 */
package gui;

import java.awt.EventQueue;

import javax.swing.*;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.rmi.RemoteException;

import client.RMIClient;
import client.IObserver;

import server.ejb.beans.Flugzeug;

@SuppressWarnings("serial")
public class MainFrame extends JComponent implements IObserver{

	/*****************************************************************************************
	 * VARIABLES
	 *****************************************************************************************/
	
	/**
	 * Konfigurationsvariablen 
	 */
	private int WINDOW_HEIGHT = 768;
	private int WINDOW_WIDTH = 1024;
	/**
	 * MainFrame swing components
	 */
	private JFrame mainWindow;
	private JLabel lblLuftraum;
	private Canvas canvas;	
	private JButton btnWechselAnsicht;
	
	/**
	 * Menu components
	 */
	private JMenuBar menuBar;
	
	private JMenu mnDatei;
	private JMenuItem mntmNeu;
	private JMenuItem mntmffnen;
	private JMenuItem mntmSpeichern;
	private JMenuItem mntmSpeichernUnter;
	private JMenuItem mntmBeenden;
	
	private JMenu mnbersichten;
	private JMenuItem mntmLandebahnen;
	private JMenuItem mntmParkpositionen;
	
	private JMenu mnOperationen;
	private JMenuItem mntmLandungDurchfhren;
	private JMenuItem mntmStartDurchfhren;
	
	private JMenu mnInfo;	
	
	/**
	 * Dialogs
	 */
	private DialogLandungDurchfuehren dlgLandungdurchfuehren;
	private DialogUebersichtLandebahnen dlgUebersichtLandebahnen;
	private DialogUebersichtParkpositionen dlgUebersichtParkpositionen;
	
	/**
	 * Dialog Shower 
	 */
	private DialogShower actionListenerShowDialogs;
	
	/**
	 * RMI Client
	 */
	private static RMIClient client = null;
	
	/******************************************************
	 * FUNCTIONS 
	 ******************************************************/
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainFrame window = new MainFrame();
					window.mainWindow.setVisible(true);
					
					System.out.println("Starte Client");
					client = new RMIClient("127.0.0.1",1001);
				} 
				catch (RemoteException e) 
				{
					System.out.println("Fehler w�hrend Kommunikation:\n"+ e.getMessage());
				}
				catch (Exception e) 
				{
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public MainFrame() {
		init();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void init() {
		// muss zuerst initialisiert werden
		initMainWindow();	
		
		initButtons();
		initCanvas();	
		initDialogs();
		initLabels();
		initMenu();
					
		addListener();
	}
	
	private void initButtons()
	{
		btnWechselAnsicht = new JButton("Wechsel Ansicht");
		btnWechselAnsicht.setBounds(10, 683, 173, 23);
		mainWindow.getContentPane().add(btnWechselAnsicht);
	}
	
	private void initCanvas()
	{
		canvas = new Canvas();
		canvas.setBackground(Color.WHITE);
		canvas.setBounds(10, 59, 998, 618);
		mainWindow.getContentPane().add(canvas);
	}
	
	private void initDialogs()
	{
		dlgLandungdurchfuehren = new DialogLandungDurchfuehren();	
		dlgUebersichtLandebahnen = new DialogUebersichtLandebahnen();
		dlgUebersichtParkpositionen = new DialogUebersichtParkpositionen();
		
		actionListenerShowDialogs = new DialogShower();
		actionListenerShowDialogs.addDialogLandungdurchfuehren(dlgLandungdurchfuehren);
		actionListenerShowDialogs.addDialogUebersichtLandebahnen(dlgUebersichtLandebahnen);
		actionListenerShowDialogs.addDialogUebersichtParkpositionen(dlgUebersichtParkpositionen);
	}
	
	private void initLabels()
	{
		lblLuftraum = new JLabel("Luftraum Ansicht:");
		lblLuftraum.setBounds(10, 39, 173, 14);
		mainWindow.getContentPane().add(lblLuftraum);
	}
	
	private void initMainWindow()
	{
		mainWindow = new JFrame();
		mainWindow.setResizable(false);
		mainWindow.setBounds(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
		mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainWindow.setTitle("SWA Flughafenprojekt");
		mainWindow.getContentPane().setLayout(null);
	}
	
	private void initMenu()
	{
		menuBar = new JMenuBar();
		menuBar.setBounds(0, 0, 1018, 21);
		mainWindow.getContentPane().add(menuBar);
		
		mnDatei = new JMenu("Datei");
		menuBar.add(mnDatei);
		
		mntmNeu = new JMenuItem("Neu");
		mnDatei.add(mntmNeu);
		
		mntmffnen = new JMenuItem("\u00D6ffnen");
		mnDatei.add(mntmffnen);
		
		mntmSpeichern = new JMenuItem("Speichern");
		mnDatei.add(mntmSpeichern);
		
		mntmSpeichernUnter = new JMenuItem("Speichern unter");
		mnDatei.add(mntmSpeichernUnter);
		
		mntmBeenden = new JMenuItem("Beenden");
		mnDatei.add(mntmBeenden);
		
		mnbersichten = new JMenu("\u00DCbersichten");
		menuBar.add(mnbersichten);
		
		mntmLandebahnen = new JMenuItem("Landebahnen");
		mnbersichten.add(mntmLandebahnen);
		
		mntmParkpositionen = new JMenuItem("Parkpositionen");
		mnbersichten.add(mntmParkpositionen);
		
		mnOperationen = new JMenu("Operationen");
		menuBar.add(mnOperationen);
		
		mntmLandungDurchfhren = new JMenuItem("Landung durchf\u00FChren");	
		mnOperationen.add(mntmLandungDurchfhren);
		
		mntmStartDurchfhren = new JMenuItem("Start durchf\u00FChren");
		mnOperationen.add(mntmStartDurchfhren);
		
		mnInfo = new JMenu("Info");
		menuBar.add(mnInfo);
	}
	
	private void addListener()
	{
		/**
		 * Buttons listener
		 */
		btnWechselAnsicht.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				/**
				 * TODO: Ansicht auf die Flugzeuge aendern
				 */
			}
		});
		
		/**
		 * Menu item listener
		 */
		mntmLandebahnen.addActionListener(actionListenerShowDialogs);		
		mntmParkpositionen.addActionListener(actionListenerShowDialogs);
		mntmLandungDurchfhren.addActionListener(actionListenerShowDialogs);
	}

	@Override
	public void Update(String type) {
		switch(type) {
			case "Dialog LD opened":
				UpdateDialogLDOpened();
				break;
			case "Dialog LD closed":
				UpdateDialogLDClosed();
				break;
				
			default: 
				break;
		};
	}
	
	private void UpdateDialogLDOpened() {
		try {
			dlgLandungdurchfuehren.maskFlugzeug.setFlugzeugListe(client.m_Adapter.getFlugzeuge());
			dlgLandungdurchfuehren.maskSollZeit.setLotsenListe(client.m_Adapter.getLotsen());
			dlgLandungdurchfuehren.maskLandebahn.setLandebahnListe(client.m_Adapter.getLandeStartbahnen());
			
			dlgLandungdurchfuehren.maskParkpositionen.setParkpositionenListe(client.m_Adapter.getParkpositionen());
		}
		catch (RemoteException e)
		{
			e.printStackTrace();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	
	private void UpdateDialogLDClosed() {
		/**
		 * TODO: Notify RMI client
		 */
		
		 try {
			client.m_Adapter.setLandebahnStatus(dlgLandungdurchfuehren.maskLandebahn.getSelectedLandebahn().getBahnId(), true);
			client.m_Adapter.setParkpositionStatus(dlgLandungdurchfuehren.maskParkpositionen.getSelectedParkposition().getParkpositionId(), true);
		 }
		 catch (RemoteException e) {
				e.printStackTrace();
		 }
	}
}
